"curl 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
"docopt 0.6.64 (registry+https://github.com/rust-lang/crates.io-index)",
"env_logger 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "filetime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"flate2 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
"git2 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
"git2-curl 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "filetime"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
[[package]]
name = "flate2"
version = "0.2.7"
time = "0.1"
toml = "0.1"
url = "0.2"
+filetime = "0.1"
[target.i686-pc-windows-gnu]
dependencies = { winapi = "0.1", advapi32-sys = "0.1", kernel32-sys = "0.1" }
#![deny(unused)]
-#![feature(metadata_ext, file_type, dir_entry_ext)]
+#![feature(file_type, dir_entry_ext)]
#![cfg_attr(test, deny(warnings))]
#[cfg(test)] extern crate hamcrest;
#[macro_use] extern crate log;
extern crate curl;
extern crate docopt;
+extern crate filetime;
extern crate flate2;
extern crate git2;
extern crate glob;
use std::path::{Path, PathBuf};
use std::sync::{Arc, Mutex};
+use filetime::FileTime;
+
use core::{Package, Target, Profile};
-use util::{self, MTime};
+use util;
use util::{CargoResult, Fresh, Dirty, Freshness, internal, profile, ChainError};
use super::Kind;
#[derive(Clone)]
enum LocalFingerprint {
Precalculated(String),
- MtimeBased(Option<MTime>, PathBuf),
+ MtimeBased(Option<FileTime>, PathBuf),
}
impl FingerprintInner {
LocalFingerprint::MtimeBased(Some(n), _) if !force => n.to_string(),
LocalFingerprint::MtimeBased(_, ref p) => {
debug!("resolving: {}", p.display());
- try!(MTime::of(p)).to_string()
+ let meta = try!(fs::metadata(p));
+ FileTime::from_last_modification_time(&meta).to_string()
}
};
let resolved = util::short_hash(&(&known, &self.extra, &deps));
Ok(old_fingerprint == new_fingerprint)
}
-fn calculate_target_mtime(dep_info: &Path) -> CargoResult<Option<MTime>> {
+fn calculate_target_mtime(dep_info: &Path) -> CargoResult<Option<FileTime>> {
macro_rules! fs_try {
($e:expr) => (match $e { Ok(e) => e, Err(..) => return Ok(None) })
}
Some(Ok(line)) => line,
_ => return Ok(None),
};
- let mtime = try!(MTime::of(dep_info));
+ let meta = try!(fs::metadata(&dep_info));
+ let mtime = FileTime::from_last_modification_time(&meta);
let pos = try!(line.find(": ").chain_error(|| {
internal(format!("dep-info not in an understood format: {}",
dep_info.display()))
file.push(' ');
file.push_str(deps.next().unwrap())
}
- match MTime::of(&cwd.join(&file)) {
- Ok(file_mtime) if file_mtime <= mtime => {}
- Ok(file_mtime) => {
- info!("stale: {} -- {} vs {}", file, file_mtime, mtime);
- return Ok(None)
- }
- _ => { info!("stale: {} -- missing", file); return Ok(None) }
+ let meta = match fs::metadata(cwd.join(&file)) {
+ Ok(meta) => meta,
+ Err(..) => { info!("stale: {} -- missing", file); return Ok(None) }
+ };
+ let file_mtime = FileTime::from_last_modification_time(&meta);
+ if file_mtime > mtime {
+ info!("stale: {} -- {} vs {}", file, file_mtime, mtime);
+ return Ok(None)
}
}
use std::io::prelude::*;
use std::path::{Path, PathBuf};
+use filetime::FileTime;
use git2;
use glob::Pattern;
use core::{Package, PackageId, Summary, SourceId, Source, Dependency, Registry};
use ops;
use util::{self, CargoResult, internal, internal_error, human, ChainError};
-use util::{MTime, Config};
+use util::Config;
pub struct PathSource<'cfg> {
id: SourceId,
return Err(internal_error("BUG: source was not updated", ""));
}
- let mut max = MTime::zero();
+ let mut max = FileTime::zero();
for file in try!(self.list_files(pkg)).iter() {
// An fs::stat error here is either because path is a
// broken symlink, a permissions error, or a race
// condition where this path was rm'ed - either way,
// we can ignore the error and treat the path's mtime
// as 0.
- let mtime = MTime::of(&file).unwrap_or(MTime::zero());
+ let mtime = fs::metadata(file).map(|meta| {
+ FileTime::from_last_modification_time(&meta)
+ }).unwrap_or(FileTime::zero());
warn!("{} {}", mtime, file.display());
max = cmp::max(max, mtime);
}
pub use self::to_semver::ToSemver;
pub use self::vcs::{GitRepo, HgRepo};
pub use self::sha256::Sha256;
-pub use self::mtime::MTime;
pub mod config;
pub mod errors;
mod dependency_queue;
mod sha256;
mod vcs;
-mod mtime;
+++ /dev/null
-use std::fmt;
-use std::fs;
-use std::io;
-use std::path::Path;
-
-/// A helper structure to represent the modification time of a file.
-///
-/// The actual value contained within is platform-specific and does not have the
-/// same meaning across platforms, but comparisons and stringification can be
-/// significant among platforms.
-#[derive(Eq, PartialEq, Ord, PartialOrd, Debug, Copy, Clone)]
-pub struct MTime {
- seconds: u64,
- nanos: u32,
-}
-
-impl MTime {
- pub fn zero() -> MTime {
- MTime { seconds: 0, nanos: 0 }
- }
-
- pub fn of(p: &Path) -> io::Result<MTime> {
- let metadata = try!(fs::metadata(p));
- Ok(MTime::from(&metadata))
- }
-}
-
-impl<'a> From<&'a fs::Metadata> for MTime {
- #[cfg(unix)]
- fn from(meta: &'a fs::Metadata) -> MTime {
- use std::os::unix::prelude::*;
- let raw = meta.as_raw();
- // FIXME: currently there is a bug in the standard library where the
- // nanosecond accessor is just accessing the seconds again, once
- // that bug is fixed this should take nanoseconds into account.
- MTime { seconds: raw.mtime() as u64, nanos: 0 }
- }
-
- #[cfg(windows)]
- fn from(meta: &'a fs::Metadata) -> MTime {
- use std::os::windows::prelude::*;
-
- // Windows write times are in 100ns intervals, so do a little math to
- // get it into the right representation.
- let time = meta.last_write_time();
- MTime {
- seconds: time / (1_000_000_000 / 100),
- nanos: ((time % (1_000_000_000 / 100)) * 100) as u32,
- }
- }
-}
-
-impl fmt::Display for MTime {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "{}.{:09}s", self.seconds, self.nanos)
- }
-}